package utils

import (
	"errors"
	"fmt"
	"go.uber.org/zap"
)

// Cover 捕获函数中的 panic 并返回 error
func Cover(f func()) (err error) {
	defer func() {
		if r := recover(); r != nil {
			// r 可以是 string、error 或其他类型
			switch x := r.(type) {
			case string:
				err = errors.New(x)
			case error:
				err = x
			default:
				err = fmt.Errorf("%v", x)
			}
			Logger.Error("捕获到异常", zap.Error(err), zap.Stack("stack"))
		}
	}()
	f()
	return
}
